﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace TangCaptureTraffic
{
    /// <summary>
    /// JSON树结构辅助类，提供将JSON字符串转换为树形结构显示的功能
    /// </summary>
    public static class TreeHelper
    {
        /// <summary>
        /// 将JSON字符串解析并构建为树形结构显示在Tree控件中
        /// </summary>
        /// <param name="tree">要显示JSON的Tree控件</param>
        /// <param name="json">要解析的JSON字符串</param>
        public static void SetJson(this AntdUI.Tree tree, string json)
        {
            // 清空现有树节点
            tree.Items.Clear();

            try
            {
                // 解析JSON字符串
                using (JsonDocument doc = JsonDocument.Parse(json))
                {
                    // 获取根元素
                    JsonElement root = doc.RootElement;

                    // 根据JSON元素类型创建根节点
                    if (root.ValueKind == JsonValueKind.Object)
                    {
                        // 创建对象根节点
                        var rootItem = new AntdUI.TreeItem { Text = "Object" };
                        tree.Items.Add(rootItem);

                        // 处理对象的属性
                        ProcessJsonObject(root, rootItem);
                    }
                    else if (root.ValueKind == JsonValueKind.Array)
                    {
                        // 创建数组根节点
                        var rootItem = new AntdUI.TreeItem { Text = "Array" };
                        tree.Items.Add(rootItem);

                        // 处理数组的元素
                        ProcessJsonArray(root, rootItem);
                    }
                    else
                    {
                        // 简单值类型
                        tree.Items.Add(new AntdUI.TreeItem { Text = root.ToString() });
                    }
                }
            }
            catch (JsonException ex)
            {
                // JSON解析错误，添加错误信息节点
                tree.Items.Add(new AntdUI.TreeItem { Text = $"JSON解析错误: {ex.Message}" });
            }
        }

        // 处理JSON对象
        /// <summary>
        /// 处理JSON对象，将其属性添加为树节点
        /// </summary>
        /// <param name="element">JSON对象元素</param>
        /// <param name="parentItem">父树节点</param>
        private static void ProcessJsonObject(JsonElement element, AntdUI.TreeItem parentItem)
        {
            foreach (JsonProperty property in element.EnumerateObject())
            {
                // 创建属性节点
                var propertyItem = new AntdUI.TreeItem { Text = property.Name };
                parentItem.Sub.Add(propertyItem);

                // 根据属性值类型处理
                ProcessJsonElement(property.Value, propertyItem);
            }
        }

        // 处理JSON数组
        /// <summary>
        /// 处理JSON数组，将其元素添加为树节点
        /// </summary>
        /// <param name="element">JSON数组元素</param>
        /// <param name="parentItem">父树节点</param>
        private static void ProcessJsonArray(JsonElement element, AntdUI.TreeItem parentItem)
        {
            int index = 0;
            foreach (JsonElement item in element.EnumerateArray())
            {
                // 创建数组元素节点
                var arrayItem = new AntdUI.TreeItem { Text = $"[{index}]" };
                parentItem.Sub.Add(arrayItem);

                // 处理数组元素
                ProcessJsonElement(item, arrayItem);

                index++;
            }
        }

        // 处理JSON元素
        /// <summary>
        /// 根据JSON元素类型处理并添加为树节点
        /// </summary>
        /// <param name="element">要处理的JSON元素</param>
        /// <param name="parentItem">父树节点</param>
        private static void ProcessJsonElement(JsonElement element, AntdUI.TreeItem parentItem)
        {
            switch (element.ValueKind)
            {
                case JsonValueKind.Object:
                    // 对象类型，添加对象标识并处理其属性
                    parentItem.Text += " : Object";
                    ProcessJsonObject(element, parentItem);
                    break;

                case JsonValueKind.Array:
                    // 数组类型，添加数组标识并处理其元素
                    parentItem.Text += " : Array";
                    ProcessJsonArray(element, parentItem);
                    break;

                case JsonValueKind.String:
                    // 字符串类型，添加值
                    parentItem.Text += $" : \"{element.GetString()}\"";
                    break;

                case JsonValueKind.Number:
                    // 数字类型，添加值
                    parentItem.Text += $" : {element.GetRawText()}";
                    break;

                case JsonValueKind.True:
                case JsonValueKind.False:
                    // 布尔类型，添加值
                    parentItem.Text += $" : {element.GetBoolean()}";
                    break;

                case JsonValueKind.Null:
                    // 空值类型，添加null标识
                    parentItem.Text += " : null";
                    break;

                default:
                    // 其他类型，添加原始文本
                    parentItem.Text += $" : {element.GetRawText()}";
                    break;
            }
        }
    }
}
